package com.haidechizi.leetcode;

import java.util.Stack;

/**
 * 根据逆波兰表示法，求表达式的值。
 * <p>
 * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 * <p>
 * 说明：
 * <p>
 * 整数除法只保留整数部分。
 * 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 * 示例 1：
 * <p>
 * 输入: ["2", "1", "+", "3", "*"]
 * 输出: 9
 * 解释: ((2 + 1) * 3) = 9
 */
public class _150_逆波兰表达式求值 {

    /**
     * @param tokens
     * @return
     */
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String token : tokens) {
            if (isOperator(token)) {
                Integer right = stack.pop();
                Integer left = stack.pop();
                stack.push(operate(token, left, right));
            } else {
                stack.push(Integer.parseInt(token));
            }
        }
        return stack.pop();

    }

    public Integer operate(String operator, Integer left, Integer right) {
        if ("+".equals(operator)) {
            return left + right;
        } else if ("-".equals(operator)) {
            return left - right;
        } else if ("*".equals(operator)) {
            return left * right;
        } else {
            return left / right;
        }
    }

    public boolean isOperator(String str) {
        return "+-*/".contains(str);
    }
}
